home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / bix01.arc / COMMON.LIB < prev    next >
Text File  |  1986-07-07  |  10KB  |  409 lines

  1.  
  2.              {  Program Name   : Common.lib                         }
  3.              {  Date Begun     : 10/01/1985                         }
  4.              {  Last Update    : 01/06/1986                         }
  5.  
  6.              {  Programmer     : Robert L. Hume                     }
  7.  
  8.              {  Copyright      : Robert L. Hume                     }
  9.              {                 : All rights Reserved                }
  10.  
  11.              {  Language       : Pascal                             }
  12.              {  Implementation : Borland Turbo Pascal Compiler      }
  13.  
  14. Procedure SwitchVar{**(var Arg1,Arg2; Size:Integer)**};
  15.   type Scratch  = Array[1..MaxInt] of Byte;
  16.    var count : Integer;
  17.        Tmp : Byte;
  18.        A1  : Scratch absolute Arg1;
  19.        A2  : Scratch absolute Arg2;
  20.   begin
  21.     for count:=1 to Size do
  22.       begin
  23.         Tmp:=A1[count];
  24.         A1[count]:=A2[count];
  25.         A2[count]:=Tmp;
  26.       end;
  27.   end;
  28.   { ** SwitchVar ** }
  29.  
  30. Function Intpower{**(number,exponent:Integer):integer **};
  31.   var value,i : Integer;
  32.   Begin
  33.     value:=1;
  34.     for i:=1 to exponent do
  35.       value:=value * number;
  36.     Intpower:=value;
  37.   End;
  38.   { ** Intpower ** }
  39.  
  40. Procedure Wait;
  41.   Begin
  42.     Delay(Wait_Duration);
  43.   End;
  44.   { ** Wait ** }
  45.  
  46. Function KeyWait{**:Byte **};
  47.   var KeyStroke : Regrec;
  48.   Begin
  49.     Flush_Keyboard;
  50.     While not Keypressed do
  51.       Lock_Detect;
  52.     KeyStroke.ax:=0;
  53.     intr($16,KeyStroke);
  54.     KeyWait:=Lo(KeyStroke.ax);
  55.     Flush_Keyboard;
  56.   End;
  57.   { ** KeyWait ** }
  58.  
  59. Procedure Set_Cursor{**(c:Byte)**};
  60.   var r: RegRec;
  61.   Begin
  62.     r.ax:=$100;
  63.     if (c=0)
  64.       then r.cx:=-$0800
  65.       else r.cx:=((13-c) shl 8) or 12;
  66.     intr($10,r);
  67.   End;
  68.   { ** Set_Cursor ** }
  69.  
  70. Procedure WhereScr{**(var x,y: Byte)**};
  71.   var r: RegRec;
  72.   Begin
  73.     r.ax:= $0300;
  74.     r.bx:= 0;
  75.     intr($10,r);
  76.     x:= succ(r.dx and $ff);
  77.     y:= succ(r.dx shr 8)
  78.   End;
  79.   { ** WhereScr ** }
  80.  
  81. Procedure Flush_keyboard;
  82.   var Ch : Char;
  83.   Begin
  84.     While keypressed do
  85.       Read(kbd,Ch);
  86.   End;
  87.   { ** Flush_keyboard ** }
  88.  
  89. Function SaveKbd{**:Byte **};
  90.   var LockStat : Byte absolute Lock_Status;
  91.   Begin
  92.     SaveKbd:=LockStat;
  93.   End;
  94.   { ** SaveKbd ** }
  95.  
  96. Procedure SetKbd{**(Status:Byte)**};
  97.   var  LockStat : Byte absolute Lock_Status;
  98.   Begin
  99.     LockStat:=Status;
  100.     Lock_Detect;
  101.   End;
  102.   { ** SetLock ** }
  103.  
  104. Procedure Lock_Detect;
  105.   const  Blank = '   ';
  106.  
  107.     function LockFlag : Byte;
  108.       begin
  109.         LockFlag:=(Lock_Status and  1) +
  110.                   (Lock_Status and  2) +
  111.                   (Lock_Status and 32) +
  112.                   (Lock_Status and 64);
  113.       end;
  114.  
  115.     procedure Num_Lock;
  116.       begin
  117.         WriteAt(74,21,h,'[N]');
  118.       end; { Num_Lock }
  119.  
  120.     procedure Caps_Lock;
  121.       begin
  122.         WriteAt(74,22,h,'[C]');
  123.       end; { Caps_Lock }
  124.  
  125.     procedure Neither;
  126.       begin
  127.         WriteAt(74,21,n,Blank);
  128.         WriteAt(74,22,n,Blank);
  129.       end;
  130.  
  131.   Begin
  132.     Case LockFlag of
  133.        1,2,96 : begin
  134.                   Num_Lock;
  135.                   Caps_Lock;
  136.                 end;
  137.      33,34,64 : begin
  138.                   Caps_Lock;
  139.                   WriteAt(74,21,n,Blank);
  140.                 end;
  141.      32,65,66 : begin
  142.                  Num_Lock;
  143.                  WriteAt(74,22,n,Blank);
  144.                end;
  145.       else
  146.         Neither;
  147.     end;
  148.   End;
  149.   { ** Lock_Detect ** }
  150.  
  151. Function Stringof{**(ascii,len:Byte) AnyStr **};
  152.   var count : Byte;
  153.       TmpStr : AnyStr;
  154.   Begin
  155.     FillChar(TmpStr,(len+1),chr(ascii));
  156.     TmpStr:=Copy(TmpStr,1,len);
  157.     Stringof:=TmpStr;
  158.   End;
  159.   { ** Stringof ** }
  160.  
  161. Procedure Whichline{**(LineType:Byte;
  162.           var hl,vl,tl,tr,bl,br,lj,rj,tj,bj,isect:Byte)**};
  163.   Begin
  164.     Case LineType of
  165.       1 : begin
  166.             hl:=196; vl:=179;
  167.             tl:=218; tr:=191;
  168.             bl:=192; br:=217;
  169.             lj:=195; rj:=180;
  170.             tj:=194; bj:=193;
  171.             isect:=197;
  172.           end;
  173.       2 : begin
  174.             hl:=205; vl:=186;
  175.             tl:=201; tr:=187;
  176.             bl:=200; br:=188;
  177.             lj:=204; rj:=185;
  178.             tj:=203; bj:=202;
  179.             isect:=206;
  180.           end;
  181.     end;
  182.   End;
  183.   { ** Whichline ** }
  184.  
  185. Procedure VLine{**(col,row,ascii,limit:Byte)**};
  186.   var count : Byte;
  187.   Begin
  188.     GotoXY(col,row);
  189.     for count:=1 to limit do
  190.       Begin
  191.         Write(chr(ascii));
  192.         GotoXY(WhereX-1,WhereY+1);
  193.       End;
  194.   End;
  195.   { ** VLine ** }
  196.  
  197. Procedure Highlight{**(s:AnyStr)**};
  198.   Begin
  199.     NormVideo;
  200.     Write(s);
  201.     LowVideo;
  202.   End;
  203.   { ** Highlight ** }
  204.  
  205. Procedure Dim{**(s:AnyStr)**};
  206.   Begin
  207.     LowVideo;
  208.     Write(s);
  209.     NormVideo;
  210.   End;
  211.   { ** Dim ** }
  212.  
  213. Procedure WriteAt{**(col,row:Byte;Attrib:DspAtt;s:AnyStr)**};
  214.   var Attribute,x,y,pos : Byte;
  215.       WhichScr,TmpOffs : Integer;
  216.  
  217.     function CalcOffset : Integer;
  218.       begin
  219.         GotoXY(col,row);
  220.         x:=WhereX; y:=WhereY;
  221.         WhereScr(x,y);
  222.         CalcOffset:=(pred(y)*SByteWidth)+((pred(x) shl 1));
  223.       end;
  224.  
  225.     procedure SetAttribute;
  226.       begin
  227.         Case ord(Attrib) of
  228.           0 : Attribute:=NormVid;
  229.           1 : Attribute:=BrtVid;
  230.           2 : Attribute:=RevVid;
  231.           3 : Attribute:=BrBlVid;
  232.           4 : Attribute:=UlineVid;
  233.         end;
  234.       end;
  235.  
  236.     procedure Display;
  237.       begin
  238.         TmpOffs:=CalcOffset;
  239.         for pos:=1 to length(s) do
  240.           begin
  241.             Screen[TmpOffs]:=ord(s[pos]);
  242.             Screen[TmpOffs+1]:=Attribute;
  243.             TmpOffs:=TmpOffs+2;
  244.           end;
  245.         GotoXY(col+pos,row);
  246.       end;
  247.  
  248.     procedure VDisplay;
  249.       begin
  250.         x:=(col shl 1)-1;
  251.         for pos:=1 to length(s) do
  252.           begin
  253.             VirScr[WhichScr]^.VirtImage[row,x]:=ord(s[pos]);
  254.             VirScr[WhichScr]^.VirtImage[row,x+1]:=Attribute;
  255.             x:=x+2;
  256.           end;
  257.       end;
  258.  
  259.   Begin
  260.     SetAttribute;
  261.     if col=0
  262.       then col:=((Width shr 1)-(length(s) shr 1));   { Center if col=0 }
  263.     WhichScr:=trunc(row/100);
  264.     row:=(row mod 100);                              { Select Screen   }
  265.     if WhichScr=0
  266.       then Display
  267.       else VDisplay;
  268.   End;
  269.   { ** WriteAt ** }
  270.  
  271. Function FKeyResp{**(Lowlmt,Uplmt:Byte):Byte **};
  272.   var KeyStroke : Regrec;
  273.   Begin
  274.     Flush_Keyboard;
  275.     Repeat
  276.       KeyStroke.ax:=0;
  277.       intr($16,KeyStroke);
  278.     Until Hi(KeyStroke.ax) in [Lowlmt..Uplmt];
  279.     FKeyResp:=Hi(KeyStroke.ax);
  280.     Flush_Keyboard;
  281.   End;
  282.   { ** FKeyResp ** }
  283.  
  284. Procedure NumInput{**( col,row,len : Byte;
  285.                       HiLo : DspAtt;
  286.                       var ReturnStr : AnyStr)**};
  287.  
  288.   var  pos,Lock,Key  : Byte;
  289.        decimal       : Boolean;
  290.        Resp          : Char;
  291.  
  292.     procedure SetUp;
  293.       begin
  294.         pos:=0; decimal:=false;
  295.         ReturnStr:=Stringof(NumerPrmt,len);
  296.         WriteAt(col,row,h,ReturnStr);
  297.       end;
  298.  
  299.     procedure Add_Next;
  300.       begin
  301.         Delete(ReturnStr,1,1);
  302.         Insert(Resp,ReturnStr,len);
  303.         WriteAt(col,row,h,ReturnStr);
  304.       end;
  305.  
  306.    procedure Exit;
  307.      begin
  308.        pos:=1;
  309.        While ReturnStr[pos]=chr(NumerPrmt) do
  310.          begin
  311.            Delete(ReturnStr,pos,1);
  312.            Insert(' ',ReturnStr,pos);
  313.            pos:=pos+1;
  314.          end;
  315.        WriteAt(col,row,HiLo,ReturnStr);
  316.        SetKbd(Lock);
  317.      end;
  318.  
  319.   Begin
  320.     Lock:=SaveKbd;
  321.     SetKbd(NumOn);
  322.     SetUp;
  323.     Repeat
  324.       Repeat
  325.         Key:=KeyWait;
  326.       Until (Key in ValidNum);
  327.       Resp:=chr(Key);
  328.       pos:=pos+1;
  329.       Case Key of
  330.         EnterKey  : if pos>0              { Return Key -- Complete }
  331.                       then pos:=len;
  332.         EscapeKey : Setup;                { Escape Key -- Restart }
  333.         MinusSign : if ReturnStr[len]=chr(NumerPrmt)
  334.                       then Add_Next;      { Minus -- First chr only }
  335.         DecimalPt : if decimal=false      { Decimal -- one only }
  336.                       then begin
  337.                              Add_Next;
  338.                              decimal:=true;
  339.                            end
  340.                       else pos:=pos-1;
  341.         else Add_Next;                    { Digits 0..9 -- Accept }
  342.       end; { Case }
  343.     Until (pos=len);
  344.     Exit;
  345.   End;
  346.   { ** NumInput ** }
  347.  
  348. Procedure AlphaInput{**( col,row,len : Byte;
  349.                         HiLo : DspAtt;
  350.                         var ReturnStr : AnyStr)**};
  351.  
  352.   var   pos,Lock,Key  : Byte;
  353.         Resp          : Char;
  354.  
  355.   procedure SetUp;
  356.     begin
  357.       pos:=0;
  358.       ReturnStr:=Stringof(AlphaPrmt,len);
  359.       WriteAt(col,row,h,ReturnStr);
  360.     end;
  361.  
  362.   procedure Add_Next;
  363.     begin
  364.       ReturnStr[pos]:=Resp;
  365.       WriteAt(col,row,h,ReturnStr);
  366.     end;
  367.  
  368.   procedure Moveback;
  369.     begin
  370.       ReturnStr[pos-1]:=chr(AlphaPrmt);
  371.       WriteAt(col,row,h,ReturnStr);
  372.       pos:=pos-2;
  373.     end;
  374.  
  375.   procedure Exit;
  376.     begin
  377.       While ReturnStr[pos]=chr(AlphaPrmt) do
  378.         begin
  379.           ReturnStr[pos]:=' ';
  380.           pos:=pos-1;
  381.         end;
  382.       WriteAt(col,row,HiLo,ReturnStr);
  383.       SetKbd(Lock);
  384.     end;
  385.  
  386.   Begin
  387.     SetUp;
  388.     Lock:=SaveKbd;
  389.     SetKbd(NumOn);
  390.     Repeat
  391.       Repeat
  392.         Key:=KeyWait;
  393.       Until (Key in ValidAlpha);
  394.       Resp:=chr(Key);
  395.       pos:=pos+1;
  396.       Case Key of
  397.         Backspace  : if pos>2
  398.                        then Moveback      { destructive Backspace }
  399.                        else SetUp;
  400.         EnterKey   : if pos>0             { Return Key -- Complete }
  401.                        then pos:=len;
  402.         EscapeKey  : Setup;               { Escape Key -- Restart }
  403.         else Add_Next;                    { Valid Entry -- Accept }
  404.       end; { Case }
  405.     Until (pos=len);
  406.     Exit;
  407.   End;
  408.   { ** AlphaInput ** }
  409.